"""
Dify API 客户端脚本
用于与 Dify AI 平台进行交互，发送查询并接收流式响应

功能:
- 从环境变量加载配置
- 发送查询请求到 Dify API
- 解析并打印流式响应数据
"""
import os
import requests
import json
from dotenv import load_dotenv

def get_modify_data(query):
    """
    向 Dify API 发送查询请求并获取响应
    
    参数:
        query (str): 用户查询的问题或指令
        
    返回:
        requests.Response: API 响应对象，包含流式数据
        
    异常:
        requests.exceptions.HTTPError: 当 HTTP 请求失败时抛出
        
    环境变量要求:
        URL: Dify API 的端点 URL
        HHH: API 认证令牌 (Bearer Token)
    """
    # 加载环境变量配置
    load_dotenv()
    
    # 从环境变量获取 API 配置
    url = os.getenv("URL")
    authori = os.getenv("HHH")
    
    # 设置请求头，包含认证信息
    headers = {
        "Authorization": f"Bearer {authori}",  # Bearer 令牌认证
        "Content-Type": "application/json"     # JSON 数据格式
    }
    
    # 构建请求数据
    data = {
        "inputs": {},                    # 输入参数（空对象）
        "query": query,                  # 用户查询
        "response_mode": "streaming",   # 流式响应模式
        "user": "123456"                 # 用户标识
    }
    
    # 发送 POST 请求到 Dify API
    respon = requests.post(url, headers=headers, json=data)
    
    # 检查响应状态，失败时抛出异常
    respon.raise_for_status()
    
    return respon

def parse_answer(respon):
    """
    解析 Dify API 的流式响应数据
    
    参数:
        respon (requests.Response): API 响应对象
        
    功能:
        - 逐行读取响应数据
        - 解析 JSON 格式的数据行
        - 提取并打印回答内容
        
    注意:
        - 只处理以 "data: " 开头的行
        - 使用流式输出实时显示回答
        - 忽略解析错误的行
    """
    # 逐行处理流式响应
    for line in respon.iter_lines():
        if line:
            line = line.decode('utf-8')  # 将字节转换为字符串
        
        try:
            # 检查是否为数据行
            if line.startswith("data: "):
                # 提取 JSON 数据部分
                line = line.split("data: ")[1]
                line = json.loads(line)
                
                # 获取回答内容
                ans = line.get("answer", "")
                
                # 实时打印回答（不换行，立即刷新）
                print(ans, end="", flush=True)
                
        except:
            # 忽略解析错误的行，继续处理下一行
            continue

if __name__ == "__main__":
    # 主函数：示例用法
    # 模拟错误输入
    query = "推理模型会给市场带来哪些心的机会"
    
    # 获取 API 响应
    respon = get_modify_data(query)
    
    # 解析并显示回答
    parse_answer(respon)
